package com.hmdp.asserts;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.hmdp.exception.BaseException;

public interface IAssert {

    @JsonProperty
    int getCode();

    @JsonProperty
    String getMsg();


    /**
     * 创建异常
     * @param message
     * @return
     */
    BaseException newException(String message);

    /**
     * 创建异常
     * @return
     */
    BaseException newException();

    /**
     *  exp 不为 true 时将会抛出异常
     * @param exp 要检测的表达式
     */
    default void checkTrue(boolean exp) {
        if (!exp) throw newException();
    }

    /**
     * 当 exp 不为 false 时抛出异常
     * @param exp 要检测的表达式
     */
    default void checkFalse(boolean exp) {
        checkTrue(!exp);
    }

    /**
     *  exp 不为 true 时将会抛出异常
     * @param exp 要检测的表达式
     */
    default void checkTrue(boolean exp, String msg) {
        if (!exp) throw newException(msg);
    }

    /**
     * 当 exp 不为 false 时抛出异常
     * @param exp 要检测的表达式
     */
    default void checkFalse(boolean exp, String msg) {
        checkTrue(!exp, msg);
    }


    /**
     * 断言对象 如果为空抛出异常
     * @param obj
     */
    default <T> T checkNotNull(T obj){

        //表达式为false会抛出异常
        checkTrue(obj!=null);
        return obj;
    }

    /**
     *
     * @param obj
     * @return
     * @param <T>
     */
    default <T> T checkNull(T obj){

        //表达式为false会抛出异常
        checkTrue(obj==null);
        return obj;
    }



}
